package br.com.lopes.gci.controller;

import static br.com.lopes.gci.util.Constants.FINALIZANDO_METODO;
import static br.com.lopes.gci.util.Constants.INICIANDO_METODO;
import static br.com.lopes.gci.util.Constants.SCOPE_REQUEST;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;

import br.com.lopes.gci.annotation.ManagedBean;
import br.com.lopes.gci.controller.Validation.ClienteValidation;
import br.com.lopes.gci.exception.ManagerException;
import br.com.lopes.gci.manager.ClienteManager;
import br.com.lopes.gci.model.Cliente;
import br.com.lopes.gci.model.Funcionario;
import br.com.lopes.gci.util.Constants;
import br.com.lopes.gci.util.MessageUtil;;

@ManagedBean
@Scope(SCOPE_REQUEST)
public class ClienteController extends ClienteValidation implements InitializingBean{
	
	public static final Logger LOGGER = Logger.getLogger(ClienteController.class);
	
	@Autowired
	private ClienteManager clienteManager;
	private Cliente cliente = new Cliente(); 
	
	private List<Cliente> listaClientes = new ArrayList<Cliente>();
	
	@Override
	public void afterPropertiesSet() throws Exception {
		// TODO Auto-generated method stub
		
	}
	
	public String pesquisarClientes(){
		System.out.println(INICIANDO_METODO + "pesquisarCliente()");
		LOGGER.debug(INICIANDO_METODO + "pesquisarCliente()");
		try{
			cliente.setFuncionario(SessionController.getUserFromSession());			
			listaClientes = clienteManager.pesquisarCliente(cliente);
			return Constants.NAVIGATION_SAME_PAGE;
			
		}catch (ManagerException me) {
			me.printStackTrace();
			return Constants.NAVIGATION_SAME_PAGE;
		}finally{
			LOGGER.debug(FINALIZANDO_METODO + "pesquisarCliente()");
			System.out.println(FINALIZANDO_METODO + "pesquisarCliente()");
			
		}
	}
	//Thiago
	public String excluirCliente(){
		System.out.println(INICIANDO_METODO + "excluirCliente()1");
		LOGGER.debug(INICIANDO_METODO + "excluirCliente()");
		try{
			Cliente cli = clienteManager.getClienteById(cliente);			
			System.out.println("ClienteController.excluirCliente");
			clienteManager.excluirCliente(cli);
			pesquisarClientes();
			MessageUtil.getInstance().setDefaultMessageFromBundle("cliente.excluido");
			return Constants.NAVIGATION_SAME_PAGE;
		}catch (ManagerException me) {	
			me.printStackTrace();
			MessageUtil.getInstance().setErrorMessage(me.getLocalizedMessage());
			return Constants.NAVIGATION_SAME_PAGE;
		}finally{
			LOGGER.debug(FINALIZANDO_METODO + "excluirCliente()");
			System.out.println(FINALIZANDO_METODO + "excluirCliente()");
			
		}
	}
	
	public String incluirCliente (){
		LOGGER.debug(INICIANDO_METODO + "incluirCliente()");
		System.out.println(INICIANDO_METODO + "incluirCliente()");
		try{
			if(validateIncluir()){
				cliente.setFuncionario(SessionController.getUserFromSession());
				clienteManager.incluirCliente(cliente);
				MessageUtil.getInstance().setDefaultMessageFromBundle("cliente.incluido");
				this.cliente = new Cliente();
				return Constants.NAVIGATION_PESQUISAR_CLIENTES;
			}
			return Constants.NAVIGATION_SAME_PAGE;
		}catch (ManagerException me) {
			me.printStackTrace();
			MessageUtil.getInstance().setErrorMessage(me.getLocalizedMessage());
			return Constants.NAVIGATION_SAME_PAGE;
		}finally{
			LOGGER.debug(FINALIZANDO_METODO + "incluirCliente()");
			System.out.println(FINALIZANDO_METODO + "incluirCliente()");
			
		}
	}
	
	public String exibirIncluirFuncionario(){
		cliente.getTipoPessoa().setCodigo(Constants.TIPO_PESSOA_FISICA);
		System.out.println("exibirIncluirFuncionario()");
		return Constants.NAVIGATION_INCLUIR_CLIENTE;
	}
	
	public ClienteManager getClienteManager() {
		return clienteManager;
	}

	public void setClienteManager(ClienteManager clienteManager) {
		this.clienteManager = clienteManager;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public List<Cliente> getListaClientes() {
		return listaClientes;
	}

	public void setListaClientes(List<Cliente> listaClientes) {
		this.listaClientes = listaClientes;
	}

}
